#include "Modbus_RTU.h"
#define timeout 200 //超时时长为100ms
#define TXD1 17
#define RXD1 18

uint16_t Modbus_RTU::CRC16_MudBus(uint8_t *puchMsg, uint8_t usDataLen){
	
	uint16_t uCRC = 0xffff;//CRC寄存器
	
	for(uint8_t num=0;num<usDataLen;num++){
		uCRC = (*puchMsg++)^uCRC;//把数据与16位的CRC寄存器的低8位相异或，结果存放于CRC寄存器。
		for(uint8_t x=0;x<8;x++){	//循环8次
			if(uCRC&0x0001){	//判断最低位为：“1”
				uCRC = uCRC>>1;	//先右移
				uCRC = uCRC^0xA001;	//再与0xA001异或
			}else{	//判断最低位为：“0”
				uCRC = uCRC>>1;	//右移
			}
		}
	}
	return uCRC;//返回CRC校验值
}

void Modbus_RTU::SendData(unsigned char * pdata, int num)
{
    Serial1.write(pdata, num);
}


bool Modbus_RTU::RecvData(unsigned char * poutData, int num)
{
    unsigned long PreTime = millis();//ms数
    while(Serial1.available() < num && (millis() - PreTime) < timeout);//等待字节数到了指定字节数
    // Serial.print("Serial1 RecvDat = ");
    // Serial.println(Serial1.available());
    if (Serial1.available() != num)
    {
        if (num == 0)
        {
            Serial.println("设备无响应!");
            return false;
        }
        else
        {
            Serial.print("返回数据量不对，删除所有数据,收到了数据量为:");
            Serial.println(Serial1.available());
            if (Serial1.available() == 5)
            {
                char ch;
                for (size_t i = 0; i < 3; i++) //第3个字节
                {
                    ch = Serial1.read();
                }
                Serial.print("错误代码为");
                Serial.println(ch,HEX);
            }
            while(Serial1.read()>0){};//读完所有的数据
            return false;
        }
    }
    else
    {
        for (size_t i = 0; i < num; i++)//读取指定字节的数据
        {
            *(poutData + i)= Serial1.read();
        }
       return true;
    }
}

void Modbus_RTU::initTrans(Modbus_RTU::_BaudRate baudRate)
{
    Serial1.begin(baudRate, SERIAL_8N1, RXD1, TXD1);//初始化串口1
    if (!Serial1)
    {
      Serial.println("Serial1 init Error!");
    }
    else{
      Serial.println("Serial1 init OK!");
    }
}